package com.edu.exam.entity.organization;

import com.edu.exam.entity.core.BaseEntity;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

/**
 * 部门类型实体类
 * 所属模块：F-03 组织架构管理模块
 * 对应数据库表：department_type
 *
 * <p>管理部门类型的基本信息，支持动态增删改查部门类型。
 * 包含类型编码、名称、描述、排序等信息，提供灵活的部门类型管理。</p>
 *
 * @author System
 * @version 1.0.0
 */
@Entity
@Table(name = "department_type")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class DepartmentType extends BaseEntity {

    /**
     * 类型编码
     * 唯一标识，用于程序内部引用
     */
    @NotBlank(message = "部门类型编码不能为空")
    @Size(max = 50, message = "部门类型编码长度不能超过50个字符")
    @Column(name = "code", unique = true, nullable = false, length = 50)
    private String code;

    /**
     * 类型名称
     * 显示名称，用于界面展示
     */
    @NotBlank(message = "部门类型名称不能为空")
    @Size(max = 100, message = "部门类型名称长度不能超过100个字符")
    @Column(name = "name", nullable = false, length = 100)
    private String name;

    /**
     * 类型描述
     * 详细说明该类型的用途和特点
     */
    @Size(max = 500, message = "部门类型描述长度不能超过500个字符")
    @Column(name = "description", length = 500)
    private String description;

    /**
     * 排序号
     * 用于界面显示的排序，数字越小越靠前
     */
    @NotNull(message = "排序号不能为空")
    @Column(name = "sort_order", nullable = false)
    @Builder.Default
    private Integer sortOrder = 999;

    /**
     * 是否启用
     * 控制该类型是否可用
     */
    @NotNull(message = "启用状态不能为空")
    @Column(name = "enabled", nullable = false)
    @Builder.Default
    private Boolean enabled = true;

    /**
     * 图标类名
     * 用于界面显示的图标CSS类名
     */
    @Size(max = 100, message = "图标类名长度不能超过100个字符")
    @Column(name = "icon_class", length = 100)
    private String iconClass;

    /**
     * 颜色标识
     * 用于界面显示的颜色值或CSS类名
     */
    @Size(max = 50, message = "颜色标识长度不能超过50个字符")
    @Column(name = "color", length = 50)
    private String color;

    /**
     * 业务验证方法
     * 验证部门类型数据的有效性和业务规则
     *
     * @return 验证是否通过
     */
    public boolean validate() {
        // 编码格式验证：只能包含字母、数字和下划线，且以大写字母开头
        if (code == null || !code.matches("^[A-Z][A-Z0-9_]*$")) {
            return false;
        }

        // 名称长度验证
        if (name == null || name.trim().isEmpty() || name.length() > 100) {
            return false;
        }

        return true;
    }

    /**
     * 获取显示文本
     * 用于界面展示的综合文本
     *
     * @return 显示文本
     */
    public String getDisplayText() {
        if (description != null && !description.trim().isEmpty()) {
            return name + " (" + description + ")";
        }
        return name;
    }

    /**
     * 是否可用
     * 判断该类型是否处于可用状态
     *
     * @return 是否可用
     */
    public boolean isAvailable() {
        return enabled != null && enabled && !Boolean.TRUE.equals(getDeleted());
    }
}